// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey*;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex*;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
#pragma once
#include "../../../sql/ast/SQLObjectImpl.h"
#include "../../../sql/ast/SQLIndex.h"
#include "../../../sql/ast/statement/SQLAlterTableItem.h"

class SQLIndexDefinition;
class SQLASTVisitor;
class SQLName;
class SQLAssignItem;
class MySqlTableIndex;
class MySqlKey;
class SQLSelectOrderByItem;

class SQLAlterTableAddIndex
    : virtual public SQLObjectImpl,
      virtual public SQLAlterTableItem,
      virtual public SQLIndex
{
public:
  SQLIndexDefinition_ptr indexDefinition;

  SQLAlterTableAddIndex();
  SHAREDOBJECT(SQLAlterTableAddIndex);

  SQLIndexDefinition_ptr getIndexDefinition();

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  BOOL_ptr isUnique();

  void setUnique(BOOL_ptr unique);

  SQLSelectOrderByItem_list_ptr getItems();

  void addItem(SQLSelectOrderByItem_ptr item);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  string_ptr getType();

  void setType(string_ptr type);

  string_ptr getUsing();

  void setUsing(string_ptr using_);

  BOOL_ptr isKey();

  void setKey(BOOL_ptr key);

  void cloneTo(MySqlTableIndex_ptr x);

  void cloneTo(MySqlKey_ptr x);

  SQLExpr_ptr getComment();

  void setComment(SQLExpr_ptr comment);

  SQLExpr_ptr getKeyBlockSize();

  void setKeyBlockSize(SQLExpr_ptr keyBlockSize);

  string_ptr getParserName();

  void setParserName(string_ptr parserName);

  BOOL_ptr isHashMapType();

  void setHashMapType(BOOL_ptr hashMapType);

  SQLExpr_ptr getOption(long hash64);

  string_ptr getDistanceMeasure();

  string_ptr getAlgorithm();

  void addOption(string_ptr name, SQLExpr_ptr value);

  SQLAssignItem_list_ptr getOptions();

  BOOL_ptr isGlobal();

  void setGlobal(BOOL_ptr global);

  SQLExpr_ptr getDbPartitionBy();

  void setDbPartitionBy(SQLExpr_ptr x);

  SQLExpr_ptr getTablePartitionBy();

  void setTablePartitionBy(SQLExpr_ptr x);

  SQLExpr_ptr getTablePartitions();

  void setTablePartitions(SQLExpr_ptr x);

  // @Override
  SQLName_list_ptr getCovering();

  // @Override
  SQLSelectOrderByItem_list_ptr getColumns();
};
